全部文档

1.4签名机制

签名时,您需在用户AccessKey管理页面查看您当前账号的 AccessKeyId 和 AccessKeySecret,然后进行加密,用户也可在该页面手动关闭或开启签名机制。其中,AccessKeyId 用于标识访问者身份;AccessKeySecret 是用于加密签名字符串和服务器端验证签名字符串的密钥,必须严格保密。

1.4.1签名步骤

请按照下面的步骤对请求进行签名:

1.4.1.1构造规范化的请求字符串

为了便于更好理解这个过程,每个步骤会以一个请求例子做演示,该请求例子的信息为:

  • 请求方法:POST
  • Query内容:
accessKeyId=gk5d91BPqvBAe3ET&signatureNonce=225&other=anything
  • Body内容:
{"productId":100610,"name":"label"}

参数排序

按参数名的字典顺序,对请求参数进行排序,包括公共请求参数(不包括 Signature 参数)和接口的自定义参数。 请求例子进行参数排序的结果为:

accessKeyId
other
signatureNonce

连接参数名和参数值

使用等号=连接请求参数名和参数值。

请求例子使用等号连接参数名和参数值的结果为:

accessKeyId=gk5d91BPqvBAe3ET
other=anything
signatureNonce=225

连接每个请求参数

使用与号&连接请求参数,参数排序与步骤"排序参数" 的排序一致。

请求例子使用与号连接各请求信息对的结果为:

accessKeyId=gk5d91BPqvBAe3ET&other=anything&signatureNonce=225

添加Body内容

在上一步处理得到的字符串后追加请求Body(JSON格式)参数内容。

请求例子追加Body的结果为:

accessKeyId=gk5d91BPqvBAe3ET&other=anything&signatureNonce=225{"productId":100610,"name":"label"}

URL 编码

对上一步处理得到的字符串进行 URL 编码,使用UTF-8字符集按照 RFC3986 规则编码整个字符串。编码规则如下:

  • 字符 A~Z、a~z、0~9 以及字符-、_、.、~不编码。
  • 其它字符编码成%XY的格式,其中XY是字符对应 ASCII 码的 16 进制表示。比如英文的双引号"对应的编码为%22。
  • 扩展的UTF-8字符,编码成%XY%ZA…的格式。
  • 英文空格要编码成%20,而不是加号+。
  • 该编码方式与application/x-www-form-urlencoded MIME格式编码算法相似,但又有所不同。

如果您使用的是Java标准库中的java.net.URLEncoder,可以先用标准库中 URLEncoder.encode()编码,随后将编码后的字符中加号+替换为%20、星号*替换为%2A、%7E替换为波浪号~,即可得到上述规则描述的编码字符串。

private static final String ENCODING = "UTF-8";
private static String percentEncode(String value) throws UnsupportedEncodingException {
    return value != null ? URLEncoder.encode(value, ENCODING).replace("+", "%20").replace("*", "%2A").replace("%7E", "~") : null;
}

完成后,即获得规范化请求字符串(CanonicalizedQueryString)。

请求例子进行编码的结果为:

accessKeyId%3Dgk5d91BPqvBAe3ET%26other%3Danything%26signatureNonce%3D225%7B%22productId%22%3A100610%2C%22name%22%3A%22label%22%7D

1.4.1.2构造签名字符串

加上请求方法构造完整的签名字符串。可参考如下规则:

StringToSign=
HTTPMethod + "&" + //HTTPMethod:发送请求的 HTTP 方法,例如 GET。
percentEncode("/") + "&" + //percentEncode("/"):字符(/)UTF-8 编码得到的值,即 %2F。
CanonicalizedQueryString//您的规范化请求字符串。

请求例子构造完整的签名字符串的结果为:

POST&%2F&accessKeyId%3Dgk5d91BPqvBAe3ET%26other%3Danything%26signatureNonce%3D225%7B%22productId%22%3A100610%2C%22name%22%3A%22label%22%7D

1.4.1.3计算签名值

按照 RFC2104 的定义,使用步骤"构造签名字符串"得到的字符串StringToSign计算签名 HMAC 值,然后对其进行Base64编码得到完整的签名值,但最终只需保留其中的英文字母和数字

signature = Base64( HMAC-SHA1( AccessSecret, UTF-8-Encoding-Of(StringToSign) ) )

说明:计算签名时,使用的 Key 就是您的 AccessKeySecret 。使用的哈希算法是 SHA1。 请求例子(AccessKeySecret =DTcub5p6muj1mS53gGpHussjpCURjqWNyca6)完整签名内容为:

5AKR4k8cRkzPARPWm9Db1nLIYHU=

只保留其中的英文字母和数字:

5AKR4k8cRkzPARPWm9Db1nLIYHU

1.4.1.4添加签名

将得到的签名值作为 signature 请求参数值,即完成对请求签名的过程。 Query内容更新为:

accessKeyId=gk5d91BPqvBAe3ET&signatureNonce=225&signature=5AKR4k8cRkzPARPWm9Db1nLIYHU&other=anything

1.4.2签名工具

为了让用户更便捷地使用开放能力,我们目前提供两种生成签名的工具:windows-exejava-sdk

1.4.2.1windows-exe工具

这是一个在windows平台运行的exe软件,用户在软件界面输入accessKeySecret、请求信息即可得到对应的签名值。使用方法:

  1. 解压exe4signature.zip压缩包;

  2. 双击运行文件夹里的SignatureTool.exe

  3. 如有弹窗“This executable was created with an evaluation version of exe4j”,点击窗口的“确定”按钮;

  4. 按照提示,输入accessKeyId对应的accessKeySecret,并按回车,即可保存秘钥信息,可以通过重新运行SignatureTool.exe来更改accessKeySecret;

  5. 按照提示,输入本次请求信息,格式为:[大写Http method] + [空格1] + [请求参数] + [空格2] + [body内容],然后按回车即可得到签名值。(所有参数必须与请求里的信息完全一致,包括body里的换行信息等)

    我们依然以“签名步骤”中的请求例子来举例,用户对应的输入是:

PUT accessKeyId=jNn7WmVg4ZakCe2i&signatureNonce=11&pageSize=5&currentPage=1&type=0 {"name": "any content"}
  1. 工具返回签名值,例如: signature=UcPI3qNCkMVJqIQQmuMUzxtrYAY=

  2. 用户可以重复第5和第6步骤来重复不同请求信息的签名内容。

1.4.2.2java-sdk工具

这是一个java sdk源代码包,自身也是一个maven项目,用户可以在自己的maven项目里添加sdk dependency来集成它。使用方法:

  1. 解压oes-openapi-sdk-java.zip压缩包;
  2. 根据自身需要,将该maven工具集成到自己的项目,也可以参照源代码开发自己的签名功能;
  3. 调用com.chinamobile.iot.SignatureUtil类的doSignature方法,该方法返回String类型的签名值,使用该方法的具体细节可参考源代码里的单元测试com.chinamobile.iot.SignatureUtilTest类。

results matching ""

    No results matching ""